package com.zkh.myutils.system;

import java.io.File;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;

import com.zkh.myutils.io.file.FileUtils;
import com.zkh.myutils.utils.StringUtils;

/**
 * 初始化上传Bean
 * @author zkh
 */
public class UploadConfigBean {
	// 允许上传类型，不设置所有文件均可上传，以|分隔
	private String[] allowType = new String[0];
	// 最大上传大小，单位b（默认8388608b，即8M）
	private long maxSize = 8388608;
	// 单个文件的最大上传大小，单位b（默认2097152，即2M）
	private long singleMaxSize = 2097152;
	// 保存上传文件的目录，以“/”或“[c-z]:”开始的，为绝对路径；其它情况开头的，为相对于项目的目录。未配置或值置空，默认upload/
	private String baseDir = "upload/";
	private String baseAbsoluteDir;
	//启用临时文件
	private boolean useTempFile = false;
	
	//默认配置
	private static UploadConfigBean config = new UploadConfigBean(ConfigLoader.getMap("upload", new HashMap<>()));
	
	/**
	 * 构造方法
	 */
	private UploadConfigBean() {}
	
	/**
	 * 构造方法
	 * @param config 配置
	 */
	private UploadConfigBean(Map<String, String> config) {
		//读取允许上传类型
		setAttr(config.get("allowType"), 1, v->this.allowType=v.split("\\|"));
		//最大上传大小
		setAttr(config.get("maxSize"), 2, v->this.maxSize=Long.parseLong(v));
		//单个文件的最大上传大小
		setAttr(config.get("singleMaxSize"), 2, v->this.singleMaxSize=Long.parseLong(v));
		//保存上传文件的目录
		setAttr(config.get("baseDir"), 1, v->this.baseDir=v);
		//启用临时文件
		useTempFile = "true".equals(config.get("useTempFile"));
	}
	
	/**
	 * 获取一个默认的上传配置。<br /><b>
	 *	1、默认单个文件上传大小2M，最大上传大小8M；<br />
	 *	2、允许常用图片上传。</b>
	 */
	public static UploadConfigBean getConfig() {
		return config;
	}
	
	/**
	 * 保存属性值
	 * @param val 配置值
	 * @param type 查询类型。1：不为空，2：是数字
	 * @param consumer 自定义处理方法
	 */
	private void setAttr(String val, int type, Consumer<String> consumer) {
		if(type==1 ? StringUtils.isNotEmpty(val) : StringUtils.isNumber(val)) {
			consumer.accept(val);
		}
	}

	/**
	 * 获取允许上传类型
	 */
	public String[] getAllowType() {
		return allowType;
	}
	
	/**
	 * 检查指定的后缀名是否允许上传（不区分大小写）
	 */
	public boolean isAllow(String suffix) {
		//不限制
		if(allowType.length==0) {
			return true;
		}
		//没有后缀
		if(suffix==null) {
			return false;
		}
		//包含允许上传的文件，返回true
		return StringUtils.isExist(suffix, true, allowType);
	}
	
	/**
	 * 获取最大上传大小
	 */
	public long getMaxSize() {
		return maxSize;
	}

	/**
	 * 获取单个文件最大大小
	 */
	public long getSingleMaxSize() {
		return singleMaxSize;
	}

	/**
	 * 获取保存目录
	 */
	public String getBaseDir() {
		//绝对目录为空
		if(baseAbsoluteDir==null) {
			/** 处理上传目录，要转换为绝对路径 **/
			//处理相对目录。以“/”或“[c-z]:”开始的，为绝对路径，其它为相对目录
			if(!baseDir.startsWith("/") && !baseDir.matches("^[c-zC-Z]:.+")) {
				//获取编译目录
				String path = ConfigLoader.class.getClassLoader().getResource("").getFile();
				//如果为空，则是个jar包，获取jar包路径
				if(path.isEmpty()) {
					path = new File("").getAbsolutePath();
				}
				//保存路径
				baseDir = path.endsWith("/") ? path + baseDir : path + "/" + baseDir;
			}
			//保存路径
			baseAbsoluteDir = baseDir;
			//调试（此处日志类Logger未初始化完全，不能使用Logger.info）
			System.out.println("已设置上传文件根目录：" + baseAbsoluteDir);
			//不存在，则创建
			FileUtils.mkdirs(new File(baseAbsoluteDir));
		}
		return baseAbsoluteDir;
	}

	/**
	 * 是否启用临时文件
	 */
	public boolean isUseTempFile() {
		return useTempFile;
	}

	@Override
	public String toString() {
		return "InitUploadBean [allowType=" + Arrays.toString(allowType)
				+ ", maxSize=" + maxSize + ", singleMaxSize=" + singleMaxSize
				+ ", baseDir=" + baseDir + ", useTempFile=" + useTempFile + "]";
	}
	
}
